/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ADO;

import Entidades.Log;
import Entidades.Usuario;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Eduardo
 */
public class Logs {

    public static final int ESCRITORIO = 1;
    public static final int MOVIL = 2;

    public enum opciones {

        RegistrarUsuario,
        InicioSesion,
        CerrarSesion,
        AbrirGrafo,
        GuardarImagen,
        AbrirImagen,
        GuardarGrafo,
    }
    private Connection conexion;

    public Logs() {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            //conexion = DriverManager.getConnection("jdbc:derby:C:\\Users\\Eduardo\\Documents\\NetBeansProjects\\trunk\\PGG\\DB\\PGG");
            conexion = DriverManager.getConnection("jdbc:derby:.\\DB\\PGG");
            conexion.setAutoCommit(false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void entrada(opciones o, int tipo) {
        Date fecha = new Date();
        Log nLog = new Log();
        nLog.setFecha(fecha.toLocaleString());
        nLog.setUsuario(Entidades.SingletonUsuario.getInstancia().getUsuario().getUsser());
        if (tipo == 1) {
            nLog.setMetodo("Escritorio");
        } else if (tipo == 2) {
            nLog.setMetodo("Remoto");
        }

        switch (o) {
            case RegistrarUsuario:
                nLog.setAccion("RegistrarUsuario");
                insertarLog(nLog);
                break;

            case InicioSesion:
                nLog.setAccion("InicioSecion");
                insertarLog(nLog);
                break;
            case CerrarSesion:
                nLog.setAccion("Cerrar Secion");
                insertarLog(nLog);
                break;
            case AbrirGrafo:
                nLog.setAccion("AbrirGrafo");
                insertarLog(nLog);
                break;
            case GuardarImagen:
                nLog.setAccion("GuardarImagen");
                insertarLog(nLog);

                break;
            case AbrirImagen:
                nLog.setAccion("AbrirImagen");
                insertarLog(nLog);
                break;
            case GuardarGrafo:
                nLog.setAccion("GuaradrGrafo");
                insertarLog(nLog);
                break;

        }
    }

    public ArrayList<String> getLogs() {
        ArrayList<String> listaLogs = new ArrayList();
        ResultSet res = null;
        PreparedStatement ps;
        String sentencia = "Select * from APP.LOGS";
        try {
            ps = conexion.prepareStatement(sentencia);
            res = ps.executeQuery();

            while (res.next()) {
                String fecha = res.getString("hora");
                String usuario = res.getString("usuario");
                String accion = res.getString("accion");
                String conexion = res.getString("tipoconexion");
                listaLogs.add(fecha + " " + usuario + " " + accion + " " + conexion);
            }
            conexion.commit();
            conexion.close();
        } catch (java.sql.SQLException e) {
            e.printStackTrace();
        }
        return listaLogs;
    }

    public ArrayList<String> getLogs(String usr) {
        ArrayList<String> listaLogs = new ArrayList();
        ResultSet res = null;
        PreparedStatement ps;
        String sentencia = "Select * from APP.LOGS";
        if (!usr.equals("Todos")) {
            sentencia += " where usuario like '" + usr + "'";
        }
        try {
            ps = conexion.prepareStatement(sentencia);

            res = ps.executeQuery();

            while (res.next()) {
                String fecha = res.getString("hora");
                String usuario = res.getString("usuario");
                String accion = res.getString("accion");
                String conexion = res.getString("tipoconexion");
                listaLogs.add(fecha + " " + usuario + " " + accion + " " + conexion);
            }
            conexion.commit();
            conexion.close();
        } catch (java.sql.SQLException e) {
            e.printStackTrace();
            return listaLogs;
        }
        return listaLogs;
    }

    public synchronized void insertarLog(Log l) {
        PreparedStatement ps;
        String insert = "insert into APP.logs (hora,usuario,accion,tipoconexion) values(?,?,?,?)";
        try {//puede q falte un ; al final de la sentencia sql
            ps = conexion.prepareStatement(insert);

            ps.setString(1, l.getFecha());
            ps.setString(2, l.getUsuario());
            ps.setString(3, l.getAccion());
            ps.setString(4, l.getMetodo());

            ps.execute();
            ps.close();
            conexion.commit();
            conexion.close();
        } catch (java.sql.SQLException e) {
            e.printStackTrace();
        }
    }

    public String[] getLogsParaMovil() {
        ArrayList<String> mLogs=getLogs();
        String[] logs = new String[mLogs.size()];
        int i = 0;
        for (String log : mLogs) {
            logs[i] = log;
            i++;
        }
        return logs;
    }
    
    public void limpiarAcciones(){
        try {
            PreparedStatement ps;
            String sentencia = "Delete from APP.LOGS";
             ps = conexion.prepareStatement(sentencia);
                ps.execute();
                conexion.commit();
                conexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(Logs.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
